package com.lab.book.common.util;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

@Slf4j
public class OrdinaryCrypt {
	public static final String sKey = "ILOVEYOUBABE!@#$";

	public static String encrypt(String sSrc, String sKey) throws Exception {
		if (StringUtils.isBlank(sKey)) {
			log.error("The sKey is empty !");
			return null;
		}

		if (sKey.length() != 16) {
			log.error("The length of sKey is not 16 !");
			return null;
		}

		byte[] raw = sKey.getBytes();
		SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
		Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");// "算法/模式/补码方式"
		IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes());// 使用CBC模式，需要一个向量iv，可增加加密算法的强度
		cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
		byte[] encrypted = cipher.doFinal(sSrc.getBytes());

		return Base64.encodeBase64String(encrypted);// 此处使用BAES64做转码功能，同时能起到2次加密的作用。
	}

	public static String decrypt(String sSrc, String sKey) throws Exception {
		if (StringUtils.isBlank(sKey)) {
			log.error("The sKey is empty !");
			return null;
		}

		if (sKey.length() != 16) {
			log.error("The length of sKey is not 16 !");
			return null;
		}

		byte[] raw = sKey.getBytes("ASCII");
		SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
		Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
		IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes());
		cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
		byte[] encrypted1 = Base64.decodeBase64(sSrc);// 先用bAES64解密

		byte[] original = cipher.doFinal(encrypted1);
		String originalString = new String(original);

		return originalString;
	}
}